/******************************************************
Cours:  LOG121
Projet: Squelette du laboratoire #1
Nom du fichier: CommBase.java
Date créé: 2013-05-03
*******************************************************
Historique des modifications
*******************************************************
*@author Patrice Boucher
2013-05-03 Version initiale
******************************************************* 
Modifer par : ADIL BELHACHEMI
Date derniere modification : 2013-05-25
*******************************************************/  

import java.beans.PropertyChangeListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.SwingWorker;

/**
 * Base d'une communication via un fil d'exécution parallèle.
 */
public class CommBase {
	
	private final int DELAI = 1000;
	private SwingWorker threadComm =null;
	private PropertyChangeListener listener;
	private boolean isActif = false;
	
	private Socket socket;
	private BufferedReader in;
	private PrintWriter out;
	
	private static final String COMMAND_GET = "GET";
	private static final String COMMAND_END = "END";
	
	private boolean apresDix = true;
	
	
	
	/**
	 * Constructeur
	 * @param listener sera alerté lors de l'appel de "firePropertyChanger" par le SwingWorker
	 * initialiser socket
	 */
	public CommBase(PropertyChangeListener listener){
		this.listener = listener;
		//getConnection();
	}
		
		
		
	
	
	/**
	 * Démarre la communication
	 */
	public void start(){
		creerCommunication();
	}
	
	/**
	 * Arrête la communication
	 */
	public void stop(){
		if(threadComm!=null)
			threadComm.cancel(true); 
		isActif = false;
	}
	
	/**
	 * Créer le nécessaire pour la communication avec le serveur
	 */
	protected void creerCommunication(){		
		// Crée un fil d'exécusion parallèle au fil courant,
		threadComm = new SwingWorker(){
			@Override	
			protected Object doInBackground() throws Exception {
				System.out.println("Le fils d'execution parallele est lance");		
				
				getConnection();
				for (int i=0;i<10;i++){
					Thread.sleep(DELAI);				
 					//La méthode suivante alerte l'observateur 
					firePropertyChange("ENVOIE-TEST", null, getForme()); 
				}
				endConnection();
				return null;
			}
		};
		threadComm.addPropertyChangeListener(listener); // La méthode "propertyChange" de ApplicationFormes sera donc appelée lorsque le SwinkWorker invoquera la méthode "firePropertyChanger" 		
		threadComm.execute(); // Lance le fil d'exécution parallèle.
		isActif = true;
	}
	
	/**
	 * @return si le fil d'exécution parallèle est actif
	 */
	public boolean isActif(){
		return isActif;
	}
	
	
	
	/*
	 * fonction qui envoie un GET et retourne forme sous chaine de caractere
	 */
	public String getForme(){
		
		String get="";
		
		
		try {
				out.println(COMMAND_GET);
				in.readLine(); 
				get = in.readLine();
				return get;	
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
		
		return null;		
	}
	
	
	public void getConnection(){
		try {
			socket = new Socket("localhost", 10000);
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
		
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	public void endConnection(){
		//if(threadComm!=null)
			//threadComm.cancel(true); 
		//isActif = false;
		
		try {
			System.out.println("END");
			in.close();
			out.close();
			socket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
	}
	
	
	
	
}
